<?php
/**
 * Core_Log
 * 
 * @author naspeh
 * @version $Id: Log.php 662 2008-06-25 20:16:56Z naspeh $
 */
class Core_Log 
{
    /**
     * Опции
     *
     * @var array
     */
    protected static $_options = array(
        'debug' => false,
        'priority' => Zend_Log::CRIT
    );
    /**
     * Логер
     *
     * @var Zend_Log
     */
    protected static $_logger = null;
    /**
     * Файл логирования 
     *
     * @var string
     */
    protected static $_file = null;
    /**
     * Стек отладки
     *
     * @var Zend_Log_Writer_Abstract
     */
    protected static $_debugWriter = null;
    /**
     * Возвращает файл логирования
     *
     * @return string
     */
    public static function getFile()
    {
        if (is_null(self::$_file)) {
        	self::$_file = DIR_VAR . DIRECTORY_SEPARATOR . 'system.log';
        }
        return self::$_file;
    }
    /**
     * Возвращает стек отладки 
     *
     * @return Zend_Log_Writer_Abstract
     */
    public static function getDebugWriter()
    {
        if (is_null(self::$_debugWriter)) {
            self::$_debugWriter = new Zend_Log_Writer_Mock();
        }
        return self::$_debugWriter;
    }
    /**
     * Возвращает логер
     *
     * @return Zend_Log
     */
    public static function getLogger()
    {
        if (is_null(self::$_logger)) {
            $logger = new Zend_Log();
            $writer = self::getDebugWriter();
            $logger->addWriter($writer);
            if (!self::getOptions()->debug) {
                $writer = new Zend_Log_Writer_Stream(self::getFile(), 'a');
                $filter = new Zend_Log_Filter_Priority(self::getOptions()->priority);
                $writer->addFilter($filter);
                $logger->addWriter($writer);
            }                      
            self::$_logger = $logger;
        }
        return self::$_logger;
    }
    /**
     * Записывает сообщение отладки
     *
     * @param string $message
     */
    public static function debug($message)
    {
        self::getLogger()->debug($message);
    }
    /**
     * Записывает критическое сообщение
     *
     * @param string $message
     */
    public static function emerg($message)
    {
        self::getLogger()->emerg($message);
    }
    /**
     * Дамп переменных
     *
     * @param mixed $var
     * @param string $label
     */
    public static function dump($var, $label = null)
    {
        if (!is_array($var) && !is_object($var)) {
            ob_start();
            var_dump($var);
            $output = ob_get_clean();
        } else {
            $output = print_r($var, 1);
        }
        if (isset($label)) {
            $format = '<b>%s</b>' . PHP_EOL . '%s';
            $output = sprintf($format, $label, $output);
        }
        self::debug($output);
    }
    /**
     * Возвращает стек отладки
     *
     * @return string|false
     */
    public static function getDebug()
    {
        if (self::getOptions()->debug) {
            $writer = self::getDebugWriter();
            $output = '';
            foreach ($writer->events as $event) {
                $output .= $event['message'] . PHP_EOL;
            }
            if (!empty($output)) {
                return '<pre>' . $output . '</pre>';
            }            
        }
        return false;        
    }
    /**
     * Возвращает лог
     *
     * @return string|false
     */
    public static function get()
    {
        if (is_file(self::getFile())) {
            $contents = file_get_contents(self::getFile());
            if (!empty($contents)) {
                return '<pre>' . $contents . '</pre>';
            }
        }
        return false;        
    }
    /**
     * Выводит стек отладки
     *
     */
    public static function echoDebug()
    {
        echo self::getDebug();
    }
    /**
     * Очищает лог
     *
     * @return boolean
     */
    public static function clean()
    {
        if (is_file(self::getFile())) {
            if (!unlink(self::getFile())) {
                return false;
            }
        }
        return true;
    }
    /**
     * Устанавливает опции
     *
     * @param Zend_Config|array $options
     */
    public static function setOptions($options)
    {
        if ($options instanceof Zend_Config) {
            self::$_options = $options->toArray();
        } else {
            self::$_options = $options;
        }
    }
    /**
     * Возвращает опции
     *
     * @return Zend_Config
     */
    public static function getOptions()
    {
        $options = new Zend_Config(self::$_options);      
        return $options;
    }    
}